/*
 * DatosCrearFlotaAvisoDestino.cpp
 *
 *  Created on: 01/02/2010
 *      Author: San Martín, Matías I.
 */

#include "DatosCrearFlotaAvisoDestino.h"

#include <sstream>

#include "../../../Framework/Common/File.h"


namespace aplicacion {

std::ostream &operator<<( std::ostream &stream, const DatosCrearFlotaAvisoDestino &obj )
{
  return stream << "DatosCrearFlotaAvisoDestino("<< obj.getTamanio() <<"):"
			  << obj._idFlota << "|" << obj._cantidadNaves << "|" << obj._semilla;
}

std::string DatosCrearFlotaAvisoDestino::toString() const
{
	std::stringstream stm;
	stm << *this;
	return stm.str();
}

DatosCrearFlotaAvisoDestino::DatosCrearFlotaAvisoDestino() {

	this->setTamanio(sizeof(_semilla) +
			sizeof(_cantidadNaves) +
			sizeof(t_identificadorFuente) +
			sizeof(T_ID_FLOTA));
}

DatosCrearFlotaAvisoDestino::~DatosCrearFlotaAvisoDestino() {
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCrearFlotaAvisoDestino::save (int fd) const
{
	size_t guardar = 0;

	//se guardan los datos especificos de esta clase
	T_ID_FLOTA idFlota;
	t_identificadorFuente idJugador;
	_idFlota.saveToMensaje(idFlota,idJugador);

	guardar += sizeof(idJugador);
	File::writeAll(fd,&idJugador,sizeof(idJugador));

	guardar += sizeof(idFlota);
	File::writeAll(fd,&idFlota,sizeof(idFlota));

	guardar += sizeof(_cantidadNaves);
	File::writeAll(fd,&_cantidadNaves,sizeof(_cantidadNaves));

	guardar += sizeof(_semilla);
	File::writeAll(fd,&_semilla,sizeof(_semilla));

	return guardar;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCrearFlotaAvisoDestino::load (int fd)
{
	//se cargan los datos
	size_t cargar = 0;

	//se cargan los datos especificos de esta clase
	T_ID_FLOTA idFlota;
	t_identificadorFuente idJugador;

	cargar += sizeof(idJugador);
	File::readAll(fd,&idJugador,sizeof(idJugador));

	cargar += sizeof(idFlota);
	File::readAll(fd,&idFlota,sizeof(idFlota));

	cargar += sizeof(_cantidadNaves);
	File::readAll(fd,&_cantidadNaves,sizeof(_cantidadNaves));

	cargar += sizeof(_semilla);
	File::readAll(fd,&_semilla,sizeof(_semilla));

	_idFlota.loadFromMensaje(idFlota,idJugador);

	this->setTamanio(cargar);
	return cargar;
}

/**
 * @see middleware::SerializableToArray#saveToArray(int)
 */
size_t DatosCrearFlotaAvisoDestino::saveToArray (uint8_t* arr) const {
	uint8_t* arr_inicial = arr;

	//se guardan los datos especificos de esta clase
	T_ID_FLOTA idFlota;
	t_identificadorFuente idJugador;
	_idFlota.saveToMensaje(idFlota,idJugador);

	memcpy(arr, &idJugador, sizeof(idJugador));
	arr += sizeof(idJugador);

	memcpy(arr, &idFlota, sizeof(idFlota));
	arr += sizeof(idFlota);

	memcpy(arr, &_cantidadNaves, sizeof(_cantidadNaves));
	arr += sizeof(_cantidadNaves);

	memcpy(arr, &_semilla, sizeof(_semilla));
	arr += sizeof(_semilla);

	return arr-arr_inicial;
}

/**
 * @see middleware::SerializableToArray#loadFromArray(int)
 */
size_t DatosCrearFlotaAvisoDestino::loadFromArray (const uint8_t* arr) {
	const uint8_t* arr_inicial = arr;

	//se cargan los datos especificos de esta clase
	T_ID_FLOTA idFlota;
	t_identificadorFuente idJugador;

	memcpy(&idJugador, arr, sizeof(idJugador));
	arr += sizeof(idJugador);

	memcpy(&idFlota, arr, sizeof(idFlota));
	arr += sizeof(idFlota);

	memcpy(&_cantidadNaves, arr, sizeof(_cantidadNaves));
	arr += sizeof(_cantidadNaves);

	memcpy(&_semilla, arr, sizeof(_semilla));
	arr += sizeof(_semilla);

	_idFlota.loadFromMensaje(idFlota,idJugador);

	size_t cargar = arr-arr_inicial;

	this->setTamanio(cargar);
	return cargar;
}

} //namespace aplicacion
